package com.itheima.service.impl;/*
@Author:李正铠
@Date:2020年04月16日16时47分
*/

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.MenuDao;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Role;
import com.itheima.service.RolerManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = RolerManageService.class)
@Transactional
public class RolerManageServiceImpl implements RolerManageService {

    @Autowired
    private RoleDao roleDao;

	@Autowired
    private MenuDao menuDao;

    /**
     * 分页组件
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //设置分页参数
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize()); //参数:1.当前页码 2.每页显示多少条
        //需要被分页的语句查询(一定要写道第一行代码后边)
        Page<Role> roleList= roleDao.findPage(queryPageBean.getQueryString()); //参数:查询条件
                //封装分页PageInfo对象  因为我们还需要得到总记录数,而这个计算由PageInfo来帮我们完成
            return new PageResult(roleList.getTotal(),roleList.getResult());
    }

    /**
     * 根据id查询对应的角色数据
     * @param roleId
     * @return
     */
    @Override
    public Role findById(Integer roleId) {
         return roleDao.findById(roleId);
    }

    /**
     * 根据roleID查询与permission关联的数据
     * @param roleId
     * @return
     */
    @Override
    public List<Integer> findRoleAndPermissionByRoleId(Integer roleId) {
       return   roleDao.findRoleAndPermissionByRoleId(roleId);
    }

    /**
     * 编辑角色数据和对应的权限关系表数据
     * @param param 角色信息
     */
    @Override
    public void update(HashMap<String,Object> param) {
        //获取角色数据
        Map<String,Object> fromDataMap = (Map<String,Object>)param.get("formData");
        Role role = new Role();
        Integer roleId = (Integer)fromDataMap.get("id");
        role.setId(roleId);
        role.setName((String)fromDataMap.get("name"));
        role.setKeyword((String)fromDataMap.get("keyword"));
        role.setDescription((String)fromDataMap.get("description"));
        //获取角色与权限的关联数据id
        List<Integer> permissionIds = (List<Integer>)param.get("permissionIds");
        //获取角色与菜单的关联数据id
        List<Integer> menuIds = (List<Integer>)param.get("menuIds");
        //编辑角色数据
        roleDao.edit(role);
         //删除相关的与权限的关系表数据
        roleDao.deletePermissionAndRoleByRoleId(roleId);
        //重新添加与权限的关系表数据
        addRoleAndPermissionRelationShip(roleId, permissionIds);
        //删除相关的雨菜单的关系表数据
        roleDao.deletMenuAndRoleByRoleId(roleId);
        //重新添加与菜单的关系表数据
        addRoleAndMenuRelationShip(menuIds,roleId);
    }

    /**
     * 添加角色与权限的关系表数据
     * @param roleId 角色id
     * @param permissionIds 权限id列表
     */
    public void addRoleAndPermissionRelationShip(Integer roleId, List<Integer> permissionIds) {
        Map<String,Integer> map=new HashMap<>();
        map.put("roleId",roleId);
        for (int permission:permissionIds){
            map.put("permissionId",permission);
            roleDao.addPermissionAndRoleByroleId(map);
        }
    }

    /**
     * 新增角色
     * @param
     */
    @Override
    public void add(HashMap<String,Object> map) {
       //获取角色数据
        Map<String,String> fromDataMap = (Map<String,String>)map.get("formData");
        //获取角色与权限的关联数据id
        List<Integer> permissionIds = (List<Integer>)map.get("permissionIds");
        //获取角色与菜单的关联数据id
        List<Integer> menuIds = (List<Integer>)map.get("menuIds");

        Role role = new Role();
        role.setName(fromDataMap.get("name"));
        role.setKeyword(fromDataMap.get("keyword"));
        role.setDescription(fromDataMap.get("description"));

        //添加角色数据
        roleDao.addRole(role);
        Integer roleId = role.getId();

        //添加与权限关系的数据
        addRoleAndPermissionRelationShip(roleId,permissionIds);

        //添加与菜单关联的数据
        addRoleAndMenuRelationShip(menuIds, roleId);

    }

    /**
     * 添加角色与菜单关联的数据
     * @param menuIds  菜单id列表
     * @param roleId 角色id
     */
    public void addRoleAndMenuRelationShip(List<Integer> menuIds, Integer roleId) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("roleId",roleId);
        if (menuIds!=null&&menuIds.size()>0){
            for (int menuId:menuIds){
                map.put("menuId",menuId);
                roleDao.addMenuAndRoleByRoleId(map);
            }

        }
    }

    /**
     * 判断角色和用户是否有关联,如果有,则不能删,通如果没有删除角色项和其关联的数据
     */
    @Override
    public void deleteRole(Integer roleId) {
        //判断id是否与用户数据相关联
        Integer count= roleDao.findRoleAndUserById(roleId);
        if (count>0){
            throw new RuntimeException(MessageConstant.DELETE_ROLEMANAGE_RELEVANCY_FAIL);
        }
        //没有关联数据,直接删除角色与权限关联的数据
        roleDao.deletePermissionAndRoleByRoleId(roleId);
        //直除删除角色与菜单的关联数据
        roleDao.deletMenuAndRoleByRoleId(roleId);
        //删除角色数据
        roleDao.deleteRoleById(roleId);
    }

    /**
     * 获得全部权限列表
     */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

}
